#Boa:Dialog:asignar

import wx
import wx.grid
import consultasBD
import utiles
import sincronizar_tabla

ROJO = (255, 145, 145, 255)
VERDE = (145, 255, 145, 255)
AZUL = (145, 145, 255, 255)
BLANCO = (255, 255, 255, 255)
AMARILLO = (254, 248, 191, 255)

def create(parent):
    return asignar(parent)

[wxID_ASIGNAR, wxID_ASIGNARBUTTON1, wxID_ASIGNARBUTTON2, wxID_ASIGNARBUTTON3, 
 wxID_ASIGNARBUTTON4, wxID_ASIGNARCOMBOBOX1, wxID_ASIGNARGRID1, 
 wxID_ASIGNARSTATICTEXT1, wxID_ASIGNARSTATICTEXT10, wxID_ASIGNARSTATICTEXT11, 
 wxID_ASIGNARSTATICTEXT12, wxID_ASIGNARSTATICTEXT13, wxID_ASIGNARSTATICTEXT14, 
 wxID_ASIGNARSTATICTEXT15, wxID_ASIGNARSTATICTEXT2, wxID_ASIGNARSTATICTEXT3, 
 wxID_ASIGNARSTATICTEXT4, wxID_ASIGNARSTATICTEXT5, wxID_ASIGNARSTATICTEXT6, 
 wxID_ASIGNARSTATICTEXT7, wxID_ASIGNARSTATICTEXT8, wxID_ASIGNARSTATICTEXT9, 
 wxID_ASIGNARTEXTCTRL1, wxID_ASIGNARTEXTCTRL10, wxID_ASIGNARTEXTCTRL11, 
 wxID_ASIGNARTEXTCTRL12, wxID_ASIGNARTEXTCTRL13, wxID_ASIGNARTEXTCTRL2, 
 wxID_ASIGNARTEXTCTRL3, wxID_ASIGNARTEXTCTRL4, wxID_ASIGNARTEXTCTRL5, 
 wxID_ASIGNARTEXTCTRL6, wxID_ASIGNARTEXTCTRL7, wxID_ASIGNARTEXTCTRL8, 
 wxID_ASIGNARTEXTCTRL9, 
] = [wx.NewId() for _init_ctrls in range(35)]

class asignar(wx.Dialog):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_ASIGNAR, name='asignar', parent=prnt,
              pos=wx.Point(369, 194), size=wx.Size(665, 335),
              style=wx.DEFAULT_DIALOG_STYLE, title='Asignacion de PTC')
        self.SetClientSize(wx.Size(657, 308))

        self.staticText1 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT1,
              label='Codigo Sussan', name='staticText1', parent=self,
              pos=wx.Point(8, 8), size=wx.Size(70, 13), style=0)

        self.textCtrl1 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL1, name='textCtrl1',
              parent=self, pos=wx.Point(8, 24), size=wx.Size(80, 21), style=0,
              value='')
        self.textCtrl1.SetEditable(False)

        self.staticText2 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT2,
              label='Descripcion', name='staticText2', parent=self,
              pos=wx.Point(88, 8), size=wx.Size(54, 13), style=0)

        self.textCtrl2 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL2, name='textCtrl2',
              parent=self, pos=wx.Point(88, 24), size=wx.Size(336, 21), style=0,
              value='')
        self.textCtrl2.SetEditable(False)

        self.staticText3 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT3,
              label='Proveedor', name='staticText3', parent=self,
              pos=wx.Point(424, 8), size=wx.Size(50, 13), style=0)

        self.textCtrl3 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL3, name='textCtrl3',
              parent=self, pos=wx.Point(424, 24), size=wx.Size(224, 21),
              style=0, value='')
        self.textCtrl3.SetEditable(False)

        self.staticText4 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT4,
              label='Estacion', name='staticText4', parent=self,
              pos=wx.Point(88, 48), size=wx.Size(40, 13), style=0)

        self.textCtrl4 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL4, name='textCtrl4',
              parent=self, pos=wx.Point(88, 64), size=wx.Size(112, 21), style=0,
              value='')
        self.textCtrl4.SetEditable(False)

        self.staticText5 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT5,
              label='Grupo', name='staticText5', parent=self, pos=wx.Point(200,
              48), size=wx.Size(29, 13), style=0)

        self.textCtrl5 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL5, name='textCtrl5',
              parent=self, pos=wx.Point(200, 64), size=wx.Size(176, 21),
              style=0, value='')
        self.textCtrl5.SetEditable(False)

        self.comboBox1 = wx.ComboBox(choices=[], id=wxID_ASIGNARCOMBOBOX1,
              name='comboBox1', parent=self, pos=wx.Point(200, 144),
              size=wx.Size(130, 21), style=0, value='')
        self.comboBox1.SetLabel('')

        self.staticText6 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT6,
              label='Costo', name='staticText6', parent=self, pos=wx.Point(88,
              88), size=wx.Size(28, 13), style=0)

        self.textCtrl6 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL6, name='textCtrl6',
              parent=self, pos=wx.Point(88, 104), size=wx.Size(80, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.textCtrl6.SetEditable(False)

        self.staticText7 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT7,
              label='P.Venta', name='staticText7', parent=self, pos=wx.Point(88,
              128), size=wx.Size(38, 13), style=0)

        self.textCtrl7 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL7, name='textCtrl7',
              parent=self, pos=wx.Point(88, 144), size=wx.Size(80, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.textCtrl7.SetEditable(False)

        self.staticText8 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT8,
              label='Cantidad', name='staticText8', parent=self,
              pos=wx.Point(304, 200), size=wx.Size(43, 13), style=0)

        self.textCtrl8 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL8, name='textCtrl8',
              parent=self, pos=wx.Point(304, 216), size=wx.Size(48, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.textCtrl8.SetEditable(False)

        self.textCtrl9 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL9, name='textCtrl9',
              parent=self, pos=wx.Point(304, 248), size=wx.Size(48, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0')
        self.textCtrl9.SetEditable(False)

        self.button1 = wx.Button(id=wxID_ASIGNARBUTTON1, label='Grabar',
              name='button1', parent=self, pos=wx.Point(304, 280),
              size=wx.Size(75, 23), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnGrabar, id=wxID_ASIGNARBUTTON1)

        self.button2 = wx.Button(id=wxID_ASIGNARBUTTON2, label='Salir',
              name='button2', parent=self, pos=wx.Point(573, 280),
              size=wx.Size(75, 23), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnSalir, id=wxID_ASIGNARBUTTON2)

        self.grid1 = wx.grid.Grid(id=wxID_ASIGNARGRID1, name='grid1',
              parent=self, pos=wx.Point(384, 64), size=wx.Size(264, 208),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnCambiaCelda)

        self.staticText9 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT9,
              label='Fecha Factura', name='staticText9', parent=self,
              pos=wx.Point(8, 184), size=wx.Size(69, 13), style=0)

        self.textCtrl10 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL10,
              name='textCtrl10', parent=self, pos=wx.Point(8, 200),
              size=wx.Size(80, 21), style=0, value='')
        self.textCtrl10.SetEditable(False)

        self.staticText10 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT10,
              label='Nro. de Factura', name='staticText10', parent=self,
              pos=wx.Point(88, 184), size=wx.Size(76, 13), style=0)

        self.textCtrl11 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL11,
              name='textCtrl11', parent=self, pos=wx.Point(88, 200),
              size=wx.Size(80, 21), style=0, value='')
        self.textCtrl11.SetEditable(False)

        self.staticText11 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT11,
              label='id factura (valor interno)', name='staticText11',
              parent=self, pos=wx.Point(88, 224), size=wx.Size(118, 13),
              style=0)
        self.staticText11.Show(False)

        self.textCtrl12 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL12,
              name='textCtrl12', parent=self, pos=wx.Point(88, 240),
              size=wx.Size(80, 21), style=0, value='')
        self.textCtrl12.SetEditable(False)
        self.textCtrl12.Show(False)

        self.staticText12 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT12,
              label='t - buscar Talle', name='staticText12', parent=self,
              pos=wx.Point(392, 280), size=wx.Size(71, 13), style=0)

        self.staticText13 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT13,
              label='c - buscar Color', name='staticText13', parent=self,
              pos=wx.Point(480, 280), size=wx.Size(75, 13), style=0)

        self.button3 = wx.Button(id=wxID_ASIGNARBUTTON3, label='Talle',
              name='button3', parent=self, pos=wx.Point(88, 280),
              size=wx.Size(75, 23), style=0)
        self.button3.Bind(wx.EVT_BUTTON, self.OnTalle, id=wxID_ASIGNARBUTTON3)

        self.button4 = wx.Button(id=wxID_ASIGNARBUTTON4, label='Color',
              name='button4', parent=self, pos=wx.Point(160, 280),
              size=wx.Size(75, 23), style=0)
        self.button4.Bind(wx.EVT_BUTTON, self.OnColor, id=wxID_ASIGNARBUTTON4)

        self.staticText14 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT14,
              label='Temporada', name='staticText14', parent=self,
              pos=wx.Point(200, 128), size=wx.Size(54, 13), style=0)

        self.staticText15 = wx.StaticText(id=wxID_ASIGNARSTATICTEXT15,
              label='Cod. Art. Proveedor', name='staticText15', parent=self,
              pos=wx.Point(200, 88), size=wx.Size(98, 13), style=0)

        self.textCtrl13 = wx.TextCtrl(id=wxID_ASIGNARTEXTCTRL13,
              name='textCtrl13', parent=self, pos=wx.Point(200, 104),
              size=wx.Size(176, 21), style=0, value='')
        self.textCtrl13.SetEditable(False)

    def __init__(self, parent, item, idregistro):
        self._init_ctrls(parent)
        self.idregistro = idregistro
        self.cargaTemporadaCombo()
        self.actualiza(item)
        self.crearGrilla()
        self.grid1.SetFocus()
        
    def OnSalir(self, event):
        self.Close()
        
    def cargaTemporadaCombo(self):
        anio = int(utiles.obtenerFecha("Y-m-d")[:4])
        mes = int(utiles.obtenerFecha("Y-m-d")[5:7])
        dia = int(utiles.obtenerFecha("Y-m-d")[-2:])
        anioanterior = anio -1
        anioactual = anio
        aniosiguiente = anio + 1
        self.comboBox1.Append("INVIERNO"+str(anioanterior))
        self.comboBox1.Append("VERANO"+str(anioanterior))
        self.comboBox1.Append("INVIERNO"+str(anioactual))
        self.comboBox1.Append("VERANO"+str(anioactual))
        self.comboBox1.Append("INVIERNO"+str(aniosiguiente))
        self.comboBox1.Append("VERANO"+str(aniosiguiente))
        self.comboBox1.SetEditable(False)

    def buscarCodArtProveedor(self,codsussan):
        sql = "SELECT codartprov FROM producto_codartprov WHERE codsussan='"+codsussan+"' "
        resultado = consultasBD.ordenCrudaDict(sql)
        print resultado
        if resultado==() or resultado==None or len(resultado)!=1:
            codartprov = ""
        else:
            codartprov = resultado[0]["codartprov"]
        return codartprov

    def actualiza(self,dato):
        self.textCtrl1.SetLabel(dato["codsussan"])
        self.textCtrl2.SetLabel(dato["descripcion"])
        self.textCtrl3.SetLabel(dato["nombre"]+" / "+dato["idproveedor"])
        self.textCtrl4.SetLabel(dato["estacion"])
        self.textCtrl5.SetLabel(dato["grupo"])
        self.textCtrl6.SetLabel(dato["costo"])
        self.textCtrl7.SetLabel(dato["pventa"])
        self.textCtrl8.SetLabel(dato["cantidad"])
        self.textCtrl10.SetLabel(dato["fechafactura"])
        self.textCtrl11.SetLabel(dato["nrofactura"])
        self.textCtrl12.SetLabel(dato["idfactura"])
        codsussan = dato["codsussan"]
        codartprov = self.buscarCodArtProveedor(codsussan)
        self.textCtrl13.SetLabel(codartprov)

    def crearGrilla(self):
        columnas = ['Talle','Color','Cantidad']
        self.grid1.CreateGrid(10,len(columnas))
        for i, col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)

        self.ajustarAnchoColumnas()
        #self.grid1.EnableEditing(False)
        #self.grid1.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
        self.grid1.Refresh()
        
    def ajustarAnchoColumnas(self):
        for y in xrange(self.grid1.GetNumberCols()):
            self.grid1.AutoSizeColumn(y,True)

    def OnCambiaCelda(self, event):
        fil = self.grid1.GetGridCursorRow()
        col = self.grid1.GetGridCursorCol()
        
##        #borra la linea si la primera celda es blanco
##        if self.grid1.GetCellValue(fil,0) == "":
##            for x in xrange(self.grid1.GetNumberCols()):
##                self.grid1.SetCellValue(fil,x,"")
##                self.actualizaCantidad()
##                return

        #consulta por Talle
        if col == 0:
            if self.grid1.GetCellValue(fil,col) == "t" or \
               self.grid1.GetCellValue(fil,col) == "T":
                import ConsultasVarias
                consultaSQL = "SELECT DISTINCT talle,' ' FROM producto_talle_color WHERE 1 ORDER BY talle"
                ventana = ConsultasVarias.ConsultasVarias(self,consultaSQL)
                try:
                    ventana.ShowModal()
                    id = ventana.Muestraid()
                    self.grid1.SetCellValue(fil, col, str(id))
                finally:
                    ventana.Destroy()
                self.grid1.Refresh()
                self.actualizaCantidad()
                return

        #consulta por Color
        if col == 1:
            if self.grid1.GetCellValue(fil,col) == "c" or \
               self.grid1.GetCellValue(fil,col) == "C":
                import ConsultasVarias
                consultaSQL = "SELECT nombre,idcolor FROM colores WHERE 1 ORDER BY nombre"
                ventana = ConsultasVarias.ConsultasVarias(self,consultaSQL)
                try:
                    ventana.ShowModal()
                    id = ventana.Muestraid()
                    aux1 = id.split(" / ")[0]
                    aux2 = id.split(" / ")[1]
                    self.grid1.SetCellValue(fil, col, str(aux2))
                finally:
                    ventana.Destroy()

                self.grid1.Refresh()
                self.actualizaCantidad()
                return
        
        #introduce un valor en la tercer columna: debe ser numero entero
        if col == 2:
            if self.grid1.GetCellValue(fil,col)=="":
                self.actualizaCantidad()
                return
            try:
                aux = int(self.grid1.GetCellValue(fil,col))
            except:
                utiles.mensaje(None,"Debe introducir un numero, sin decimales")
                self.grid1.SetCellValue(fil,col,"")
                self.actualizaCantidad()
                return
            if fil == (self.grid1.GetNumberRows()-1):
                self.grid1.AppendRows()

        self.actualizaCantidad()

    def actualizaCantidad(self):
        cantidad = 0
        for fil in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fil,0)<>"":
                try:
                    cantidad+= int(self.grid1.GetCellValue(fil,2))
                except:
                    pass
        self.textCtrl9.SetLabel(str(cantidad))
        aux1 = int(self.textCtrl8.GetLabel())
        aux2 = int(self.textCtrl9.GetLabel())
        if aux2<aux1:
            self.button1.Enable(True)
            self.textCtrl9.SetBackgroundColour(BLANCO)
        elif aux2==aux1:
            self.button1.Enable(True)
            self.textCtrl9.SetBackgroundColour(VERDE)
        else:
            self.button1.Enable(False)
            self.textCtrl9.SetBackgroundColour(ROJO)

    def buscar_producto_talle_color(self, codsussan, talle, color, sucursal, temporada, sentenciasSQLsincronizables):
        '''Retorna el ptc que tenga los atrib de parametro, si no esta lo crea'''
        r1 = "SELECT * FROM producto_talle_color "
        r2 = "WHERE codsussan='%s' AND talle='%s' AND color='%s'" % (codsussan, talle, color)
        sql = r1+r2
        resultados = consultasBD.ordenCrudaResultDictSinCommit(sql)
        if len(resultados) == 0:
            try:
                consultasBD.begin()
                ptc = utiles.secuencia("producto_talle_color", sucursal)
                consultasBD.commit()
            except:
                consultasBD.rollback()
                utiles.mensaje(None,"No ha podido crearse PTC")
                self.errorGrave = True
                return "",sentenciasSQLsincronizables
            r1 = "INSERT INTO producto_talle_color ("
            r2 = "id, codsussan, talle, color, temporada) "
            r3 = "VALUES ("
            r4 = "'%s', '%s', '%s', '%s', '%s')" % (ptc, codsussan, talle, color, temporada)
            sql = r1+r2+r3+r4
            sentenciasSQLsincronizables.append(sql)
            #sincronizar_tabla.addChange(sql=sql)
            #consultasBD.executaSinCommit(None, sql)
            return ptc,sentenciasSQLsincronizables

        return (resultados['id'],sentenciasSQLsincronizables)

    def crear_stock_si_no_esta(self, ptc, sucursal, sentenciasSQLsincronizables):
        '''Retorna el stock que tenga los atrib de parametro, si no esta lo crea'''
        sql = "SELECT * FROM stock WHERE ptc = '%s' AND sucursal = '%s'" % (ptc, sucursal)
        resultado = consultasBD.ordenCrudaResultDictSinCommit(sql)
        sql_stock = ""
        if len(resultado) == 0:
            print "Creando articulo en stock"
            sql = "SELECT idsucursal FROM sucursales WHERE 1 ORDER BY idsucursal"
            resultado = consultasBD.ordenCruda(sql)
            for item in resultado:
                sucursal = str(item[0])
                sql_stock = "INSERT INTO stock (ptc, sucursal, stock) VALUES ('%s', '%s', '%s')" %\
                (ptc, sucursal, "0")
                sentenciasSQLsincronizables.append(sql_stock)
                #sincronizar_tabla.addChange(sql=sql_stock)
                #consultasBD.executaSinCommit(None, sql_stock)
        return sentenciasSQLsincronizables

    def agregarColumna(self):
        self.grid1.AppendCols()
        columnas = ['PTC','Talle','Color','Cant']
        for i, col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)
        for fil in xrange(self.grid1.GetNumberRows()):
            self.grid1.SetCellValue(fil,3,self.grid1.GetCellValue(fil,2))
            self.grid1.SetCellValue(fil,2,self.grid1.GetCellValue(fil,1))
            self.grid1.SetCellValue(fil,1,self.grid1.GetCellValue(fil,0))
            self.grid1.SetCellValue(fil,0,"")
            self.grid1.SetReadOnly(fil,0)
            self.grid1.SetReadOnly(fil,1)
            self.grid1.SetReadOnly(fil,2)
            self.grid1.SetReadOnly(fil,3)
        self.ajustarAnchoColumnas()

    def pasarUpperCase(self):
        for fil in xrange(self.grid1.GetNumberRows()):
            for col in xrange(self.grid1.GetNumberCols()):
                aux = self.grid1.GetCellValue(fil,col)
                aux = aux.upper()
                self.grid1.SetCellValue(fil,col,aux)
        self.grid1.Refresh()

    def verificarGrilla(self):
        if self.comboBox1.GetSelection()<0:
            utiles.mensaje(None,"Debe indicar una temporada")
            return False
        for fil in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fil,0)=="":
                for col in xrange(self.grid1.GetNumberCols()):
                    self.grid1.SetCellValue(fil,col,"")
                continue
            if self.grid1.GetCellValue(fil,1)=="":
                utiles.mensaje(None,"Falta indicar color en fila "+str(fil+1))
                self.grid1.SetCellValue(fil,1,"")
                return False
            if self.grid1.GetCellValue(fil,2)=="":
                utiles.mensaje(None,"Falta indicar cantidad en fila "+str(fil+1))
                self.grid1.SetCellValue(fil,1,"")
                return False
            try:
                cantidad = int(self.grid1.GetCellValue(fil,2))
            except:
                utiles.mensaje(None,"La cantidad es incorrecta en fila "+str(fil+1))
                self.grid1.SetCellValue(fil,2,"")
                return False
        return True

    def OnGrabar(self, event):
        if not self.verificarGrilla():
            return
        self.pasarUpperCase()
        self.agregarColumna()

        print "generando PTC"

        sucursal = utiles.getSucursalActiva()
        codsussan = self.textCtrl1.GetLabel()
        idfactura = self.textCtrl12.GetLabel()
        nrofactura = self.textCtrl11.GetLabel()
        nombre,idproveedor = (self.textCtrl3.GetLabel()).split(" / ")
        temporada = self.comboBox1.GetLabel()

        sentenciasSQL = []
        sentenciasSQLsincronizables = []

#        try:
        #consultasBD.begin() # COMIENZO EL ALMACENAMIENTO... HASTA EL COMMIT

        #asigna PTC, lo graba en producto_talle_color y lo muestra en la planilla
        for fila in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fila,1)=="":
                continue
            talle = self.grid1.GetCellValue(fila,1)
            color = self.grid1.GetCellValue(fila,2)
            cantidad = int(self.grid1.GetCellValue(fila,3))

            self.errorGrave = False
            ptc,sentenciasSQLsincronizables = self.buscar_producto_talle_color(codsussan,talle,color,sucursal,temporada,sentenciasSQLsincronizables)
            if self.errorGrave: return
            self.grid1.SetCellValue(fila,0,ptc)
            sentenciasSQLsincronizables = self.crear_stock_si_no_esta(ptc,sucursal,sentenciasSQLsincronizables)
            stock = utiles.stock_sumado(ptc, sucursal, cantidad)
            stock_previo = stock - cantidad
            stock_nuevo = stock
            #utiles.agregar_movimiento(ptc, stock_previo, stock_nuevo, operacion='compra', idcompra = idfactura, sucursal=sucursal)

            print "Actualizando stock:",ptc
            r1 = "UPDATE stock SET stock = '%s' " % (stock)
            r2 = "WHERE ptc = '%s' AND sucursal = '%s' " % (ptc, sucursal)
            sql = r1+r2
            sentenciasSQLsincronizables.append(sql)
            #sincronizar_tabla.addChange(sql=sql)
            #consultasBD.executaSinCommit(None, sql)

        self.ajustarAnchoColumnas()

        diferencia = int(self.textCtrl8.GetLabel())-int(self.textCtrl9.GetLabel())

        #actualiza compras_items grabando PTC particulares
        for fila in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fila,0)=="":
                continue
            talle = self.grid1.GetCellValue(fila,1)
            color = self.grid1.GetCellValue(fila,2)
            cantidad = self.grid1.GetCellValue(fila,3)
            costounidad = self.textCtrl6.GetLabel()
            
            print "Actualizando factura de compra"
            r1 = "INSERT INTO compras_items (idfactura, codsussan, color, "
            r2 = "                           talle, cantidad, costounidad) "
            r3 = "VALUES ("
            r4 = "'%s', '%s', '%s'," % (idfactura, codsussan, color)
            r5 = "'%s', '%s', '%s')" % (talle, cantidad, costounidad)
            sql = r1+r2+r3+r4+r5
            sentenciasSQL.append(sql)
            #consultasBD.executaSinCommit(None, sql)

        #elimina ZZZ generico
        print "Actualizando factura de compra: eliminando pendientes"
        r1 = "UPDATE compras_items SET color='PROCESADO' "
        r2 = "WHERE idcompras_items = '"+self.idregistro+"' "
        r3 = "      AND color='zZz' AND talle='ZzZ'"
        sql = r1+r2+r3
        sentenciasSQL.append(sql)
        #consultasBD.executaSinCommit(None, sql)

        #si no se ha asignado a todos los PTC, se graba la diferencia en un generico
        if diferencia>0:
            talle = "zZz"
            color = "ZzZ"
            cantidad = diferencia
            costounidad = self.textCtrl6.GetLabel()
            
            print "Actualizando factura de compra: nuevos pendientes"
            r1 = "INSERT INTO compras_items (idfactura, codsussan, color,"
            r2 = "                           talle, cantidad, costounidad) "
            r3 = "VALUES ("
            r4 = "'%s', '%s', '%s'," % (idfactura, codsussan, color)
            r5 = "'%s', '%s', '%s')" % (talle, cantidad, costounidad)
            sql = r1+r2+r3+r4+r5
            sentenciasSQL.append(sql)
            #consultasBD.executaSinCommit(None, sql)

        #grabando etiquetas
        print "Actualizando etiquetas"
        codsussan = self.textCtrl1.GetLabel()
        descripcion = self.textCtrl2.GetLabel()
        idproveedor = idproveedor
        precio = self.textCtrl7.GetLabel()
        listaColores = {}
        sql = "SELECT idcolor,nombre FROM colores"
        resultado = consultasBD.ordenCrudaDict(sql)
        if len(resultado)==0:
            listaColores = {}
        else:
            for item in resultado:
                listaColores[str(item["idcolor"])]=item["nombre"]
        for fil in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fil,0)=="":
                continue
            ptc = self.grid1.GetCellValue(fil,0)
            talle = self.grid1.GetCellValue(fil,1)
            color = self.grid1.GetCellValue(fil,2)
            try:
                nombreColor = listaColores[color]
            except:
                nombreColor = ""
            cantidad = self.grid1.GetCellValue(fil,3)
            r1 = "INSERT INTO etiquetas (codsussan,ptc,descripcion,talle,color,"
            r2 = "            nombrecolor,idproveedor,precio,cantidad) "
            r3 = "VALUES ("
            r4 = "'%s', '%s', '%s', '%s'," % (codsussan, ptc, descripcion, talle)
            r5 = "'%s', '%s', '%s', " % (color, nombreColor, idproveedor)
            r6 = "'%s', '%s') " % (precio, cantidad)
            sql = r1+r2+r3+r4+r5+r6
            sentenciasSQL.append(sql)
            #consultasBD.executaSinCommit(None, sql)

        #consultasBD.commit() # FIN DE COMMIT, SE GRABA TODO AHORA, Y SINO, NADA

        try:
            consultasBD.begin() # COMIENZO EL ALMACENAMIENTO... HASTA EL COMMIT
            print "Grabando Asignacion de PTC"
            for sql in sentenciasSQLsincronizables:
                print sql
                consultasBD.executaSinCommit(None, sql)
                sincronizar_tabla.addChange(sql=sql)
            for sql in sentenciasSQL:
                print sql
                consultasBD.executaSinCommit(None, sql)
            consultasBD.commit() # FIN DE COMMIT, SE GRABA TODO AHORA, Y SINO, NADA
        except:
            consultasBD.rollback()
            utiles.mensaje(None,"Error en la grabacion")
            return

        try:
            sincronizar_tabla.syncServerTables(self, ["productos", "producto_talle_color", "stock"])
            cantidad = self.textCtrl9.GetLabel()
            utiles.mensaje(None,"PTC procesados: "+str(cantidad)+"\nNO procesados: "+str(diferencia))
        except:
            utiles.mensaje(None,"Error sincronizando.\nHagalo en forma manual.")
        
        self.Close()

    def OnTalle(self, event):
        import ConsultasVarias
        consultaSQL = "SELECT DISTINCT talle,' ' FROM producto_talle_color WHERE 1 ORDER BY talle"
        ventana = ConsultasVarias.ConsultasVarias(self,consultaSQL)
        try:
            ventana.ShowModal()
        finally:
            ventana.Destroy()

    def OnColor(self, event):
        import ConsultasVarias
        consultaSQL = "SELECT nombre,idcolor FROM colores WHERE 1 ORDER BY nombre"
        ventana = ConsultasVarias.ConsultasVarias(self,consultaSQL)
        try:
            ventana.ShowModal()
        finally:
            ventana.Destroy()
    
